package ntd.util.frame.action.iot.context;

import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Entity;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import ntd.util.config.common.exception.ComException;
import ntd.util.frame.data.factory.FactoryData;
import ntd.util.frame.data.tool.ToolMysql;

import java.util.List;
import java.util.Map;

/**
 * 设备上下文
 */
@Data
public class IotContext {

    /** 设备编码 */
    private String deviceCode;

    /** 设备信息 */
    private Entity device;

    /** 产品信息 */
    private Entity product;

    /** 设备配置信息 */
    private Entity deviceConfig;

    /** 设备配置json */
    private JSONObject configJson;

    /** 设备服务信息 */
    private List<Entity> services;

    /** 设备服务map映射 */
    private Map<String, Entity> serviceMap;

    /**
     * 初始化设备上下文信息
     * @param deviceCode 设备编码
     * @return 设备上下文
     */
    
    public static IotContext init(String deviceCode) {
        //数据库
        ToolMysql toolMysql = new ToolMysql(FactoryData.dataSource());
        IotContext iotContext = new IotContext();

        // 设备编码
        iotContext.setDeviceCode(deviceCode);

        // 设备信息
        iotContext.setDevice(toolMysql.findOne("things_device", "code", deviceCode));
        if (ObjectUtil.isNull(iotContext.getDevice())) {
            throw new ComException("找不到设备信息，请联系管理员！");
        }

        // 设备配置信息
        iotContext.setDeviceConfig(toolMysql.findOne("things_device_config", "code", deviceCode));
        if (ObjectUtil.isNotNull(iotContext.getDeviceConfig())) {
            // 设备配置json
            iotContext.setConfigJson(JSONUtil.parseObj(iotContext.getDeviceConfig().getStr("config")));
        }

        // 设备产品信息
        iotContext.setProduct(toolMysql.findById("things_product", iotContext.getDevice().getStr("product_id")));

        // 设备产品 - 服务信息
        String services = iotContext.getProduct().getStr("services");
        if (StrUtil.isNotBlank(services)) {
            if (JSONUtil.isTypeJSONArray(services)) {
//                iotContext.setServices(toolMysql.db.find(Entity.create("things_service").set("id", JSONUtil.parseArray(services))));
            } else {
//                iotContext.setServices(toolMysql.db.find(Entity.create("things_service").set("id", services)));
            }
        }

        // 服务信息map映射封装
        if (CollectionUtil.isNotEmpty(iotContext.getServices())) {
            iotContext.setServiceMap(CollStreamUtil.toIdentityMap(iotContext.getServices(), entity -> entity.getStr("code")));
        }

        return iotContext;
    }
}
